﻿using System;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Windows.Forms;

namespace ContagemFieiras
{
    public partial class frmFieiras : Form
    {
        #region Declarações
        private string _linha;
        private char _turno;
        private string[] _ordem;
        private frmEntrada _entrada;
        private DataView _dvLinhasTarefas, _dvProducao;
        private SqlCommandBuilder _builder;
        private FileMts _fileMetragem;
        #endregion

        public frmFieiras()
        { InitializeComponent(); }

        private void frmFieiras_Load(object sender, EventArgs e)
        {            
            _entrada = new frmEntrada();                        
            _entrada.tmr_Stop();
            Dock = DockStyle.Fill;

            _entrada.daLinhas_TarefasFill();
            _dvLinhasTarefas = new DataView(_entrada.dsFilkemp.Tables["dtLinhas_Tarefas"]);

            dtDate.Value = DateTime.Now;
            dtTime.Text = DateTime.Now.TimeOfDay.ToString();

            _builder = new SqlCommandBuilder(frmEntrada.daProducao);            
        }

        private void txtLinha_KeyUp(object sender, KeyEventArgs e)
        { if (e.KeyCode == Keys.Enter) refreshFrame(); }

        private void txtLinha_DoubleClick(object sender, EventArgs e)
        { refreshFrame(); }

        private void refreshFrame()
        {
            limpaTextos();
            _linha = txtLinha.Text;
            buscaLinha();
            calculaTurno();
        }

        private void buscaLinha()
        {
            _fileMetragem = new FileMts();

            _linha = txtLinha.Text;
            _dvLinhasTarefas.RowFilter = "([Estado] Like 'Em Producao' or [Estado] Like 'Fim de Producao') and [Linha]='" +
            _linha + "'";


            if (_dvLinhasTarefas.Count > 0 &&
                _dvLinhasTarefas[_dvLinhasTarefas.Count - 1]["Estado"].ToString() != "Fim de Producao")
            {
                calculaTurno();

                _ordem = _dvLinhasTarefas[_dvLinhasTarefas.Count - 1]["Observacoes"].ToString().Replace('"', ' ').Split('#');
                lblOrdem.Text = _ordem[0].TrimStart();
                lblLote.Text = _ordem[1];
                lblProduto.Text = _ordem[2];
                lblDesProd.Text = _ordem[3];
                lblCliente.Text = _ordem[5];
                lblKilos.Text = _ordem[6];
                lblUnidades.Text = _ordem[7];
                lblEncomenda.Text = _ordem[8];
                lblPosEncomenda.Text = _ordem[9];

                _entrada.dtProducao.Clear();
                _entrada.daProducaoFill();

                _dvProducao = new DataView(_entrada.dsFilkemp.Tables["dtProducao"]);
                _dvProducao.RowFilter = "Ordem Like '" + lblOrdem.Text.Trim() + "'";

                gridContagens.DataSource = _dvProducao;

                lblVirada.Text = (gridContagens.Rows.Count + 1).ToString();

                foreach (DataGridViewColumn col in gridContagens.Columns) col.Visible = false;

                try
                {
                    gridContagens.Columns["Data"].Visible = true;
                    gridContagens.Columns["Hora"].Visible = true;
                    gridContagens.Columns["Hora"].ValueType = typeof(DateTime);
                    gridContagens.Columns["Kgs"].Visible = true;
                    gridContagens.Columns["Kgs"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
                    gridContagens.Columns["Unidades"].Visible = true;
                    gridContagens.Columns["Unidades"].DefaultCellStyle.Alignment =
                        DataGridViewContentAlignment.MiddleRight;
                    gridContagens.Columns["Operador"].Visible = true;
                    gridContagens.Columns["Operador"].DefaultCellStyle.Alignment =
                        DataGridViewContentAlignment.MiddleRight;
                }
                catch (Exception ex)
                { MessageBox.Show(ex.Message); }

                double y = double.Parse(_ordem[11]) * double.Parse(_ordem[12]);
                double maxViradas = Math.Ceiling(int.Parse(_ordem[7]) / y);

                if (gridContagens.Rows.Count + 1 > maxViradas)
                {
                    btnGravar.Enabled = false;
                    MessageBox.Show("Não pode inserir mais viradas");
                }
                else btnGravar.Enabled = true;
            }
            else limpaTextos();

            if (gridContagens.RowCount > 0)
            {
                double kilos = 0;
                double unidades = 0;
                foreach (DataGridViewRow drow in gridContagens.Rows)
                {
                    if (!string.IsNullOrEmpty(drow.Cells["Kgs"].Value.ToString()))
                        kilos += double.Parse(drow.Cells["Kgs"].Value.ToString());

                    if (!string.IsNullOrEmpty(drow.Cells["Unidades"].Value.ToString()))
                        unidades += double.Parse(drow.Cells["Unidades"].Value.ToString());
                }

                lblKgsProd.Text = kilos.ToString();
                lblKgsProduzir.Text = (double.Parse(lblKilos.Text) - kilos).ToString();

                lblUnProd.Text = unidades.ToString();
                lblUniProduzir.Text = (double.Parse(lblUnidades.Text) - unidades).ToString();
            }
        }

        private void calculaTurno()
        {
            const string turno1 = "DDCCCBBBBAAACCCCDDDAAAABBBDD";
            const string turno2 = "AAADDDDDDDBBBBBBBCCCCCCCAAAA";
            const string turno3 = "CBBBAAAACCCDDDDAAABBBBDDDCCC";

            double difDias = Math.Truncate(dtDate.Value.Subtract(Convert.ToDateTime("24-12-2006")).TotalDays);
            int y = Convert.ToInt32(difDias - Math.Truncate(Math.Truncate(difDias / 28) * 28));

            if (y == 0) y = 27;

            DateTime time = DateTime.Parse(dtTime.Text);
            if (time >= DateTime.Parse("00:00") && time <= DateTime.Parse("08:00"))
                _turno = turno1[y];
            if (time >= DateTime.Parse("08:01") && time <= DateTime.Parse("16:00"))
                _turno = turno2[y];
            if (time >= DateTime.Parse("16:01") && time <= DateTime.Parse("23:59"))
                _turno = turno3[y];

            lblTurno.Text = _turno.ToString();
        }

        private void dtTime_KeyUp(object sender, KeyEventArgs e)
        {
            if ((e.KeyCode == Keys.Enter) && (dtTime.Text.Trim().Length == 5))
                if (int.Parse(dtTime.Text.Substring(0, 2)) <= 23 && int.Parse(dtTime.Text.Substring(3, 2)) <= 59) calculaTurno();
        }

        private void dtTime_Validating(object sender, CancelEventArgs e)
        {
            string value = dtTime.Text.Replace(":", "").Trim();
            if (string.IsNullOrEmpty(value) || value.Length < 4)
            {
                e.Cancel = true;
                return;
            }

            Int32 hour = default(Int32);
            if (Int32.TryParse(value.Substring(0, 2), out hour) == false)
            {
                e.Cancel = true;
                return;
            }

            if (hour < 0 || hour > 23)
            {
                e.Cancel = true;
                return;
            }

            Int32 minute = default(Int32);
            if (Int32.TryParse(value.Substring(2, 2), out minute) == false)
            {
                e.Cancel = true;
                return;
            }
            if (minute < 0 || minute > 59)
            {
                e.Cancel = true;
                return;
            }
        }

        private void dtTime_Leave(object sender, EventArgs e)
        {
            if (dtTime.Text.Trim().Length == 5)
                if (int.Parse(dtTime.Text.Substring(0, 2)) <= 23 && int.Parse(dtTime.Text.Substring(3, 2)) <= 59) calculaTurno();
        }

        private void btnGravar_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("Tem a certeza?", "Deseja Gravar?", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
            {
                DataRow dRow = _entrada.dsFilkemp.Tables["dtProducao"].NewRow();
                dRow.ItemArray = new object[]
                                     {
                                         null, txtLinha.Text, dtDate.Text, dtTime.Text, lblOrdem.Text, lblLote.Text,
                                         lblProduto.Text, lblDesProd.Text, lblCliente.Text, txtKilosOk.Text,
                                         txtUniOk.Text, txtKilosNOk.Text, txtUniNOk.Text, lblEncomenda.Text,
                                         lblPosEncomenda.Text, lblVirada.Text,
                                         lblTurno.Text, txtObs.Text, frmEntrada.dvUsers[0][0]
                                     };

                _entrada.dsFilkemp.Tables["dtProducao"].Rows.Add(dRow);
                frmEntrada.daProducao.InsertCommand = _builder.GetInsertCommand();
                frmEntrada.daProducao.Update(_entrada.dsFilkemp.Tables["dtProducao"]);
                txtKilosOk.Text = "";
                txtKilosNOk.Text = "";
                txtUniOk.Text = "";
                txtUniNOk.Text = "";

                limpaTextos();
                dtTime.Text = DateTime.Now.TimeOfDay.ToString();

                MessageBox.Show("Gravado com sucesso.");
            }
        }

        private void limpaTextos()
        {
            txtUniOk.Text = "";
            txtUniNOk.Text = "";
            lblUniProduzir.Text = "";
            lblUnProd.Text = "";
            txtMetragem.Text = "";
            txtKilosOk.Text = "";
            txtKilosNOk.Text = "";
            lblKgsProduzir.Text = "";
            lblKgsProd.Text = "";
            lblKilos.Text = "";
            lblOrdem.Text = "";
            lblLote.Text = "";
            lblProduto.Text = "";
            lblDesProd.Text = "";
            lblCliente.Text = "";
            lblUnidades.Text = "";
            lblEncomenda.Text = "";
            lblPosEncomenda.Text = "";
            lblTurno.Text = "";
            lblVirada.Text = "";
        }

        private void txtUniOk_TextChanged(object sender, EventArgs e)
        {
            if (!string.IsNullOrEmpty(lblOrdem.Text))
                if (!string.IsNullOrEmpty(txtMetragem.Text.Trim()) && !string.IsNullOrEmpty(txtUniOk.Text.Trim()))
                    txtKilosOk.Text = (_fileMetragem.calculaMts(decimal.Parse(txtUniOk.Text), decimal.Parse(txtMetragem.Text), lblProduto.Text)).ToString("0.000");
        }

        private void txtMetragem_TextChanged(object sender, EventArgs e)
        {
            if (!string.IsNullOrEmpty(lblOrdem.Text))
                if (!string.IsNullOrEmpty(txtUniOk.Text.Trim()) && !string.IsNullOrEmpty(txtMetragem.Text.Trim()))
                    txtKilosOk.Text = (_fileMetragem.calculaMts(decimal.Parse(txtUniOk.Text), decimal.Parse(txtMetragem.Text), lblProduto.Text)).ToString("0.000");
        }

        private void txtUniNOk_TextChanged(object sender, EventArgs e)
        {
            if (!string.IsNullOrEmpty(lblOrdem.Text))
                if (!string.IsNullOrEmpty(txtUniNOk.Text.Trim()) && !string.IsNullOrEmpty(txtMetragem.Text.Trim()))
                    txtKilosNOk.Text = _fileMetragem.calculaMts(decimal.Parse(txtUniNOk.Text), decimal.Parse(txtMetragem.Text), lblProduto.Text).ToString("0.000");
        }

        private void txtNum_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (char.IsLetter(e.KeyChar)) e.Handled = true;
        }
    }
}